mirror of
https://github.com/flutter/samples.git
synced 2025-11-08 13:58:47 +00:00
Dart 3.9 / Flutter 3.35 [first LLM release] (#2714)
I got carried away with Gemini and basically rewrote CI and the release process for the new LLM reality. This work was largely completed by Gemini. - Bump all SDK versions to the current beta (3.9.0-0) - Run `flutter channel beta` - Wrote `ci_script.dart` to replace the bash scripts - Converted repository to pub workspace #2499 - Added llm.md and release.md - Added redirect for deprecated Samples Index ## Pre-launch Checklist - [x] I read the [Flutter Style Guide] _recently_, and have followed its advice. - [x] I signed the [CLA]. - [x] I read the [Contributors Guide]. - [x] I have added sample code updates to the [changelog]. - [x] I updated/added relevant documentation (doc comments with `///`).
This commit is contained in:
@@ -129,19 +129,16 @@ class MyApp extends StatelessWidget {
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: '/',
|
||||
builder:
|
||||
(context, state) => const MainMenuScreen(key: Key('main menu')),
|
||||
builder: (context, state) =>
|
||||
const MainMenuScreen(key: Key('main menu')),
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: 'play',
|
||||
pageBuilder:
|
||||
(context, state) => buildMyTransition<void>(
|
||||
key: ValueKey('play'),
|
||||
child: const LevelSelectionScreen(
|
||||
key: Key('level selection'),
|
||||
),
|
||||
color: context.watch<Palette>().backgroundLevelSelection,
|
||||
),
|
||||
pageBuilder: (context, state) => buildMyTransition<void>(
|
||||
key: ValueKey('play'),
|
||||
child: const LevelSelectionScreen(key: Key('level selection')),
|
||||
color: context.watch<Palette>().backgroundLevelSelection,
|
||||
),
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: 'session/:level',
|
||||
@@ -190,8 +187,8 @@ class MyApp extends StatelessWidget {
|
||||
),
|
||||
GoRoute(
|
||||
path: 'settings',
|
||||
builder:
|
||||
(context, state) => const SettingsScreen(key: Key('settings')),
|
||||
builder: (context, state) =>
|
||||
const SettingsScreen(key: Key('settings')),
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -238,10 +235,9 @@ class MyApp extends StatelessWidget {
|
||||
),
|
||||
Provider<SettingsController>(
|
||||
lazy: false,
|
||||
create:
|
||||
(context) =>
|
||||
SettingsController(persistence: settingsPersistence)
|
||||
..loadStateFromPersistence(),
|
||||
create: (context) =>
|
||||
SettingsController(persistence: settingsPersistence)
|
||||
..loadStateFromPersistence(),
|
||||
),
|
||||
ProxyProvider2<
|
||||
SettingsController,
|
||||
|
||||
@@ -36,11 +36,10 @@ class AdsController {
|
||||
void preloadAd() {
|
||||
// TODO: When ready, change this to the Ad Unit IDs provided by AdMob.
|
||||
// The current values are AdMob's sample IDs.
|
||||
final adUnitId =
|
||||
defaultTargetPlatform == TargetPlatform.android
|
||||
? 'ca-app-pub-3940256099942544/6300978111'
|
||||
// iOS
|
||||
: 'ca-app-pub-3940256099942544/2934735716';
|
||||
final adUnitId = defaultTargetPlatform == TargetPlatform.android
|
||||
? 'ca-app-pub-3940256099942544/6300978111'
|
||||
// iOS
|
||||
: 'ca-app-pub-3940256099942544/2934735716';
|
||||
_preloadedAd = PreloadedBannerAd(
|
||||
size: AdSize.mediumRectangle,
|
||||
adUnitId: adUnitId,
|
||||
|
||||
@@ -150,10 +150,9 @@ class _BannerAdWidgetState extends State<BannerAdWidget> {
|
||||
// https://developers.google.com/admob/android/test-ads. When ready,
|
||||
// you replace this with your own, production ad unit ID,
|
||||
// created in https://apps.admob.com/.
|
||||
adUnitId:
|
||||
Theme.of(context).platform == TargetPlatform.android
|
||||
? 'ca-app-pub-3940256099942544/6300978111'
|
||||
: 'ca-app-pub-3940256099942544/2934735716',
|
||||
adUnitId: Theme.of(context).platform == TargetPlatform.android
|
||||
? 'ca-app-pub-3940256099942544/6300978111'
|
||||
: 'ca-app-pub-3940256099942544/2934735716',
|
||||
size: size,
|
||||
request: const AdRequest(),
|
||||
listener: BannerAdListener(
|
||||
|
||||
@@ -48,9 +48,8 @@ class _PlaySessionScreenState extends State<PlaySessionScreen> {
|
||||
return MultiProvider(
|
||||
providers: [
|
||||
ChangeNotifierProvider(
|
||||
create:
|
||||
(context) =>
|
||||
LevelState(goal: widget.level.difficulty, onWin: _playerWon),
|
||||
create: (context) =>
|
||||
LevelState(goal: widget.level.difficulty, onWin: _playerWon),
|
||||
),
|
||||
],
|
||||
child: IgnorePointer(
|
||||
@@ -80,17 +79,14 @@ class _PlaySessionScreenState extends State<PlaySessionScreen> {
|
||||
' or above!',
|
||||
),
|
||||
Consumer<LevelState>(
|
||||
builder:
|
||||
(context, levelState, child) => Slider(
|
||||
label: 'Level Progress',
|
||||
autofocus: true,
|
||||
value: levelState.progress / 100,
|
||||
onChanged:
|
||||
(value) => levelState.setProgress(
|
||||
(value * 100).round(),
|
||||
),
|
||||
onChangeEnd: (value) => levelState.evaluate(),
|
||||
),
|
||||
builder: (context, levelState, child) => Slider(
|
||||
label: 'Level Progress',
|
||||
autofocus: true,
|
||||
value: levelState.progress / 100,
|
||||
onChanged: (value) =>
|
||||
levelState.setProgress((value * 100).round()),
|
||||
onChangeEnd: (value) => levelState.evaluate(),
|
||||
),
|
||||
),
|
||||
const Spacer(),
|
||||
Padding(
|
||||
|
||||
@@ -10,9 +10,8 @@ import 'settings.dart';
|
||||
void showCustomNameDialog(BuildContext context) {
|
||||
showGeneralDialog(
|
||||
context: context,
|
||||
pageBuilder:
|
||||
(context, animation, secondaryAnimation) =>
|
||||
CustomNameDialog(animation: animation),
|
||||
pageBuilder: (context, animation, secondaryAnimation) =>
|
||||
CustomNameDialog(animation: animation),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,21 +42,19 @@ class SettingsScreen extends StatelessWidget {
|
||||
const _NameChangeLine('Name'),
|
||||
ValueListenableBuilder<bool>(
|
||||
valueListenable: settings.soundsOn,
|
||||
builder:
|
||||
(context, soundsOn, child) => _SettingsLine(
|
||||
'Sound FX',
|
||||
Icon(soundsOn ? Icons.graphic_eq : Icons.volume_off),
|
||||
onSelected: () => settings.toggleSoundsOn(),
|
||||
),
|
||||
builder: (context, soundsOn, child) => _SettingsLine(
|
||||
'Sound FX',
|
||||
Icon(soundsOn ? Icons.graphic_eq : Icons.volume_off),
|
||||
onSelected: () => settings.toggleSoundsOn(),
|
||||
),
|
||||
),
|
||||
ValueListenableBuilder<bool>(
|
||||
valueListenable: settings.musicOn,
|
||||
builder:
|
||||
(context, musicOn, child) => _SettingsLine(
|
||||
'Music',
|
||||
Icon(musicOn ? Icons.music_note : Icons.music_off),
|
||||
onSelected: () => settings.toggleMusicOn(),
|
||||
),
|
||||
builder: (context, musicOn, child) => _SettingsLine(
|
||||
'Music',
|
||||
Icon(musicOn ? Icons.music_note : Icons.music_off),
|
||||
onSelected: () => settings.toggleMusicOn(),
|
||||
),
|
||||
),
|
||||
Consumer<InAppPurchaseController?>(
|
||||
builder: (context, inAppPurchase, child) {
|
||||
@@ -137,14 +135,13 @@ class _NameChangeLine extends StatelessWidget {
|
||||
const Spacer(),
|
||||
ValueListenableBuilder(
|
||||
valueListenable: settings.playerName,
|
||||
builder:
|
||||
(context, name, child) => Text(
|
||||
'‘$name’',
|
||||
style: const TextStyle(
|
||||
fontFamily: 'Permanent Marker',
|
||||
fontSize: 30,
|
||||
),
|
||||
),
|
||||
builder: (context, name, child) => Text(
|
||||
'‘$name’',
|
||||
style: const TextStyle(
|
||||
fontFamily: 'Permanent Marker',
|
||||
fontSize: 30,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -188,17 +188,17 @@ class _PaperSnipping {
|
||||
paint.color = backColor;
|
||||
}
|
||||
|
||||
final path =
|
||||
Path()..addPolygon(
|
||||
List.generate(
|
||||
4,
|
||||
(index) => Offset(
|
||||
position.x + corners[index].x * size,
|
||||
position.y + corners[index].y * size * cosA,
|
||||
),
|
||||
final path = Path()
|
||||
..addPolygon(
|
||||
List.generate(
|
||||
4,
|
||||
(index) => Offset(
|
||||
position.x + corners[index].x * size,
|
||||
position.y + corners[index].y * size * cosA,
|
||||
),
|
||||
true,
|
||||
);
|
||||
),
|
||||
true,
|
||||
);
|
||||
canvas.drawPath(path, paint);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user