1
0
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:
Eric Windmill
2025-08-14 12:26:24 -07:00
committed by GitHub
parent 0aa5415d5e
commit 2999d738b8
410 changed files with 28166 additions and 27661 deletions

View File

@@ -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,

View File

@@ -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,

View File

@@ -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(

View File

@@ -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(

View File

@@ -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),
);
}

View File

@@ -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,
),
),
),
],
),

View File

@@ -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);
}