RainVisitor Blog

RainVisitor

【文章內容使用 Gemini 1.5 Pro 自動產生】

原文:https://medium.com/flutter/how-to-build-your-own-flutter-slide-puzzle-93721ac5fad2

您可能已經閱讀過 [Flutter 拼圖黑客挑戰](https://flutterhack.devpost.com/),並正在思考如何將您的創造力推向新的極限。我們在此提供有關樣本程式碼庫結構的更多資訊,並提供一些關於如何建立您的比賽提交的一些想法。

滑動拼圖架構

提供的原始碼實作了一個分層架構,使用 flutter_bloc 管理狀態。Bloc 處理從遊戲邏輯到主題的所有內容。所有狀態都以一致的方式管理;針對拼圖邏輯的任何更新,您只需要找到對應的 bloc 並更新它。重設和洗牌遊戲按鈕、計時器和倒計時都是獨立的 bloc,因此這些可能是您考慮實作創造性的其他地方:也許是沙漏作為計時器?或者是一個華麗的洗牌順序?

請注意,所有遊戲邏輯都包含在一個名為 PuzzleBloc 的單一 bloc 中。它將透過事件更新,例如點擊一個磁磚以移動拼圖磁磚的 TileTapped 事件,或使用 PuzzleReset 完全重設拼圖板。每次拼圖更新時,都會發出新的拼圖狀態。

class PuzzleBloc extends Bloc<PuzzleEvent, PuzzleState> {
PuzzleBloc(this._size, {this.random}) : super(const PuzzleState() {
on<PuzzleInitialized>(_onPuzzleInitialized);
on<TileTapped>(_onTileTapped);
on<PuzzleReset>(_onPuzzleReset);
}
  void _onPuzzleInitialized(
PuzzleInitialized event,
Emitter<PuzzleState> emit,
) {...}
void _onTileTapped(
TileTapped event,
Emitter<PuzzleState> emit,
) {...}
void _onPuzzleReset(
PuzzleReset event,
Emitter<PuzzleState> emit,
) {...}
}

自訂主題

樣本拼圖程式碼包含 Simple 和 Dashatar 兩種主題。這些可以用作您自訂主題的起點 - 盡情借用所需部分,或從頭開始。您如何實作拼圖取決於您自己!您可以考慮發揮創造力的其中一個地方是拼圖主題。

Flutter slide puzzle with Dash in the lower right corner

所有演示中的主題都在 PuzzlePage 的頂部發生。它已抽象化,因此您只需要更新一個地方的主題元素,更改就會反映到所有地方。Simple 和 Dashatar 主題都定義了一系列選項,例如螢幕背景、選單、標誌、按鈕、文字顏色、主題是否顯示計時器(Dashatar 主題中出現,但 Simple 主題中沒有),等等。您可以在儲存庫根目錄的「dashatar」和「simple」目錄中找到它們。

/// {@template simple_theme}
/// The simple puzzle theme.
/// {@endtemplate}
class SimpleTheme extends PuzzleTheme {
/// {@macro simple_theme}
const SimpleTheme() : super();
  @override
Color get backgroundColor => PuzzleColors.white;
  @override
Color get buttonColor => PuzzleColors.primary6;
  @override
Color get hoverColor => PuzzleColors.primary3;
  @override
Color get pressedColor => PuzzleColors.primary7;
  ...
}

每個拼圖主題都有一個 LayoutDelegate,它計算該主題的佈局。您可以透過重複使用相同的佈局物件,僅調整一些主題選項來建立新的主題。對於更進階的設計,整個主題 LayoutDelegate 都可以自訂。例如,您可以覆寫 backgroundBuilder 以製作自訂背景,僅在大型螢幕上顯示。

@override
Widget backgroundBuilder(PuzzleState state) {
return Positioned(
bottom: 74,
right: 50,
child: ResponsiveLayoutBuilder(
small: (_, child) => const SizedBox(),
medium: (_, child) => const SizedBox(),
large: (_, child) => const DashatarThemePicker(),
),
);
}

實作動畫

動畫是您在滑動拼圖中探索的絕佳元素。雖然 Simple 主題不包含任何動畫,但 Dashatar 程式碼實作了一些動畫,其中一些是 [交錯](https://docs.flutter.dev/development/ui/animations/staggered-animations) 的。這些動畫由單一動畫控制器驅動,使用 [Interval](https://api.flutter.dev/flutter/animation/Interval-class.html) 調整以延遲動畫,並使用 [Tween](https://api.flutter.dev/flutter/animation/Tween-class.html) 定義動畫的數值範圍。這可以在 Dashatar 拼圖的成功狀態中看到,其中多個 Widget 透過動畫其偏移量和不透明度而逐漸出現。類似地,倒計時器的每個滴答都使用相同的技術,緩慢地增長然後淡出,就像下一個滴答即將出現一樣。

Dashatar slide puzzle mid-shuffle with a puzzle timer above

Dashatar 主題中的大多數動畫都是隱含的。這表示您無需自行撰寫整個動畫,因為 Widget 會自行對屬性更改進行動畫。舉例來說,請查看 DashatarPuzzleTile Widget,了解如何對使用者點擊磁磚時磁磚的移動進行動畫。每當點擊磁磚時,其目前的 position 會更新,並透過隱含動畫的 AnimatedAlign 在給定的 movementDuration 內轉場。

class DashatarPuzzleTile extends StatelessWidget {
...

final Tile tile;

@override
Widget build(BuildContext context) {
return AnimatedAlign(
alignment: FractionalOffset(
(tile.currentPosition.x - 1) / (size - 1),
(tile.currentPosition.y - 1) / (size - 1),
),
duration: movementDuration,
curve: Curves.easeInOut,
child: ResponsiveLayoutBuilder(...),
);
}
}

為網頁設計

樣本拼圖是為網頁而建的。它為三個螢幕尺寸實作了響應式設計:小型、中型和大型。此外,還有一個 ResponsiveLayoutBuilder,它使用 Flutter LayoutBuilder Widget 的包裝器,允許您根據不同的斷點指定不同的 Widget。

由於我們以網頁為目標,因此有一些額外的注意事項需要牢記。應用程式會預先快取圖片和一些音訊,以幫助優化遊戲期間的效能。當使用者到達預設的 Simple 拼圖遊戲時,Dashatar 版本的資產會在後台載入(我們對 [I/O 照片亭](https://github.com/flutter/photobooth) 載入所有道具的方式採取了類似的方法)。這將確保一旦使用者導航到 Dashatar 主題,大多數資產將已經載入,確保順暢的使用者體驗。

雖然應用程式在網頁上很方便,但您可以挑戰自己探索以創新方式讓拼圖擴展到多個平台的方法。您的拼圖在行動裝置和桌面上會是什麼樣子?您如何為多個平台調整您的想法?

無障礙性

滑動拼圖的設計考慮了無障礙性。使用者可以使用鍵盤與拼圖互動。這是透過 RawKeyboardListener 完成的,RawKeyboardListener 是一個在使用者按下或放開鍵盤上的鍵時會呼叫回呼的 Widget。使用者也可以使用螢幕閱讀器與應用程式互動。這是透過 [語義標籤](https://api.flutter.dev/flutter/widgets/Semantics-class.html) 完成的。還有一些提示,使用 Tooltip Widget 為某些操作顯示。如果您要從頭開始建立滑動拼圖提交,我們強烈建議使用上面類似的策略,使您的拼圖對所有使用者都具有無障礙性。

額外想法

您可以隨意使用演示程式碼庫作為您的提交的基礎。或者,您可以從頭開始實作一個新想法。重要的是您的提交是一個有效的滑動拼圖 - 但您如何實現它取決於您自己!

Simple 和 Dashatar 範例應該可以讓您了解您可以自訂的地方,或者您可以自行建立的酷炫事物。我們探索的一個有趣想法是將 [由 Felix Blaschke 建立的 Flutter Plasma](https://flutterplasma.dev/) 投影到拼圖磁磚上。電漿效果可以使用包裝在 Transform Widget 中的 CustomPaint Widget 實現,並使用 AnimationController 進行動畫。您可以在 [此處](https://github.com/felixblaschke/sa3_liquid/blob/main/lib/liquid/plasma/plasma.dart) 找到用在演示中的電漿渲染器的範例。

Slide puzzle with plasma gradient effect displayed on the tiles and rockstar Dash in the lower right corner

另一個想法是從 API 擷取圖片或其他資料。例如,您可以使用 [Google 照片 API](https://developers.google.com/photos) 使用您最喜歡的 Google 照片相簿中的照片製作滑動拼圖。這個挑戰的可能性是無限的!

在此查看樣本拼圖程式碼 [here](https://github.com/VGVentures/slide_puzzle)。在 Twitter 上使用 #FlutterPuzzleHack 與我們分享您的創作。我們迫不及待想看看您會建立什麼!

【文章內容使用 Gemini 1.5 Pro 自動產生】

原文:https://medium.com/flutter/announcing-the-flutter-puzzle-hack-ffc74fda6d44

宣布 Flutter Puzzle Hack!

The Flutter Puzzle Hack logo
Flutter Puzzle Hack 標誌

準備好拋開節日塵埃,嘗試一個有趣的程式設計專案,測試您對 Flutter 的知識嗎?我們很高興宣布 Flutter Puzzle Hack,這是我們最新的挑戰,看看您能用 Flutter 做出什麼,以及贏得超過 50,000 美元獎金的機會。我們請您開發出最具創意但可解的滑動拼圖,目標是網頁上的 Flutter。無論您是創造出新的設計、從頭開始重建拼圖,還是以新的有趣方式整合套件,我們都希望看到您能將想像力發揮到什麼程度。

閱讀全文 »

【文章內容使用 Gemini 1.5 Pro 自動產生】

Flutter 2.8 的新功能

北半球的季節變換,樹葉變色,氣溫下降,今年的最後一個穩定版本也到來了。歡迎來到 Flutter 2.8!這個版本代表了 207 位貢獻者和 178 位審查者的辛勤工作,共產生了 2,424 個合併的 PR 和 2976 個已關閉的議題。特別感謝本次版本的主要社群貢獻者 Bartosz Selwesiuk,他是 Very Good Ventures 的 Flutter 工程師,他貢獻了 23 個 PR,其中大部分都與 Web 平台的相機功能相關。

閱讀全文 »

【文章內容使用 Gemini 1.5 Pro 自動產生】

原文:https://medium.com/flutter/announcing-general-availability-for-the-google-mobile-ads-sdk-for-flutter-574e51ea6783

應用程式有許多賺錢方式:作為實體商店的店面接受付款;提供訂閱或應用程式內購;或在您的應用程式中直接包含廣告。今天,我們很興奮地宣布,在六個月的 Beta 測試期後,[Google 行動廣告 SDK for Flutter](https://pub.dev/packages/google_mobile_ads) 現在正式上市。這是需要在應用程式中顯示廣告的 Flutter 應用程式的重大消息!

支援的廣告格式

Google 行動廣告 (GMA) SDK for Flutter 適用於 iOS 和 Android,並支援載入和顯示所有 Google [行動廣告格式](https://developers.google.com/admob/flutter/quick-start),包括:

橫幅廣告:一種矩形廣告,佔用應用程式佈局中的位置。這些廣告會在使用者與應用程式互動時保持在螢幕上,無論是固定在螢幕頂部或底部,還是與內容保持一致並隨著使用者捲軸而捲動。除了標準的固定尺寸橫幅廣告外,我們還支援適應橫幅廣告,這些廣告會根據設備的寬度和高度顯示最佳橫幅大小。

插頁式廣告:全螢幕廣告,會覆蓋應用程式的整個螢幕。這些廣告最適合放置在應用程式中的自然間隔或轉場處。

獎勵影片廣告:一種獎勵廣告單元,讓您可以透過與影片廣告、可玩廣告和調查互動來獎勵使用者應用程式內物品。這是遊戲開發人員中最受歡迎的廣告格式之一。

原生廣告:一種高度自訂的格式,讓您可以設計廣告以符合應用程式內容的外觀和風格。

應用程式開啟廣告:一種廣告格式,用於變現您的行動應用程式載入體驗。應用程式開啟廣告會在使用者開啟或切回您的應用程式時顯示。

Google AdMob 和廣告管理員

我們與 Google 廣告團隊合作建立了這個 Plugin,作為 Flutter 開發人員的官方廣告解決方案。GMA SDK for Flutter 將對 **Google AdMob 和 Google 廣告管理員** 的支援整合到單一 Plugin 中。

如果您不熟悉 Google 的廣告服務,您可能不知道 [AdMob](https://admob.google.com/home/) 和 [廣告管理員](http://admanager.google.com/home) 是兩種具有不同變現功能的不同產品。AdMob 平台專為希望從廣告中賺錢並獲得可行洞察以發展應用程式業務的行動開發人員設計。廣告管理員平台專為擁有大量直接銷售或多種庫存類型的發佈者設計。

[GMA SDK for Flutter](https://pub.dev/packages/google_mobile_ads) 整合了這些產品,透過在 iOS 和 Android 之間共用程式碼來滿足您的變現需求,並且無需重新編寫程式碼即可滿足不斷增長的需要。

中介和出價

此版本還包含新的中介功能預覽,可幫助您優化廣告效能。[中介](https://developers.google.com/admob/flutter/mediation/get-started) 可幫助您在一個位置管理用於向您的應用程式提供廣告的各種廣告來源。除了 Google 的需求外,您也可以透過此功能從非 Google 廣告網路提供廣告。使用中介,您可以將收到的廣告請求發送到多個廣告來源,並找到最佳的可用來源來滿足這些請求。除了傳統的中介外,它還支援出價,讓廣告來源可以透過即時拍賣來爭奪滿足您的廣告請求。這有助於確保您的每次展示都能獲得最高收益。

GMA SDK for Flutter 提供了與 iOS 和 Android 應用程式相同的廣告功能。您可以使用相同的工具來管理您的活動、追蹤廣告效能等等。

早期採用者

我們一直在與一些早期採用者合作,他們渴望在我們的生產版本發佈之前先開始使用 Flutter 的廣告支援。其中一位開發人員是 Lotum,他們最近重寫了他們非常成功的文字遊戲「[4 Pics 1 Word](https://play.google.com/store/apps/details?id=de.lotum.whatsinthefoto.us&hl=en_US&gl=US)」,這是一款在 50 個國家名列前茅的應用程式,僅 Android 版本的安裝次數就超過了 5000 萬次。他們選擇使用 Flutter 重寫,並使用 GMA SDK for Flutter 顯示插頁式廣告和獎勵影片。

應用程式 Flutter 開發人員 Petra Langenbacher 表示:

「我們已經對我們的應用程式進行了多年的微調和優化,我們想知道完整的重寫是否會影響我們的收益或使用者群體。但我們很驚喜地發現,情況並非如此:我們能夠進行這些更改,而不會產生任何負面影響!」

感謝 Lotum 和所有其他早期採用者提供寶貴的回饋。我們感謝您對此初始版本的幫助。

其他變現功能

除了廣告外,Flutter 還提供其他變現應用程式的方法。例如,[應用程式內購](https://pub.dev/packages/in_app_purchase) Plugin 讓您可以在您的應用程式中提供額外的內容,例如付費服務、數位商品和訂閱。Flutter 的 [Pay](https://pub.dev/packages/pay) Plugin 讓您的應用程式可以在 Android 設備上整合 Google Pay,在 iOS 上整合 Apple Pay。這使您能夠透過使用者在支付雜貨、零售商品和外送等事物時透過無縫體驗快速輕鬆地支援兩個平台。

有關我們的廣告或其他變現產品的更多資訊,請[查看我們新更新的網站](https://flutter.dev/monetization),您可以在其中找到範例、Codelab 和文件!

建立 Flutter 應用程式僅是開始。我們希望透過我們的變現功能套件,幫助您使用 Flutter 成功創業!

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

宣布 DartPad 支援套件

今天,我們很高興地宣布,DartPad 現在支援套件!DartPad 是一個開源的、基於 Web 的程式碼遊樂場,可以直接在您的 Web 瀏覽器中運行 Dart 和 Flutter 應用程式。它允許您快速運行 Dart 程式碼以測試想法或編寫技術概念,而無需在您的本機系統上安裝 Flutter SDK 或任何工具。

閱讀全文 »

【文章內容使用 Gemini 1.5 Pro 自動產生】

原文:https://medium.com/flutter/about-web-community-and-code-samples-q3-2021-survey-results-b67f5b997dca

關於網頁、社群和程式碼範例 - Q3 2021 調查結果

Flutter UX 團隊的季度調查報告回來了!這是我們第 14 次季度調查,在 8 月份持續了一週,透過各種管道宣佈,例如 IDE 彈出視窗、推特公告以及在 flutter.dev 上。我們收到了超過 8,000 位您的回應,一如往常,我們從中學到了很多關於您需求的資訊。

閱讀全文 »

【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】

原文:https://medium.com/dartlang/google-summer-of-code-2021-results-e514cce50fc

Google Summer of Code 2021 成果

Google Summer of Code (GSoC) 是一個全球性的計劃,旨在讓學生開發人員參與開放原始碼軟體開發。Google 贊助學生在夏季與一個指導性的開放原始碼組織合作進行一個為期 10 週的編程專案。在過去的 16 年中,已有超過 16,000 名學生參與了 Google Summer of Code。

閱讀全文 »
0%