導覽器與 Hero 控制器範圍中更嚴格的斷言
摘要
#當框架偵測到有多個導覽器向一個 hero 控制器範圍註冊時,會擲回斷言錯誤。
背景
#hero 控制器範圍會為其 Widget 子樹狀結構裝載 hero 控制器。hero 控制器一次只能支援一個導覽器。先前,沒有斷言來保證這一點。
變更說明
#如果在此變更之後程式碼開始拋出斷言錯誤,這表示程式碼在這次變更之前就已經有問題。可能有多個導覽器 (Navigator) 註冊在同一個英雄控制器範圍 (Hero Controller Scope) 下,當它們的路徑變更時,無法觸發英雄動畫。這次變更只是將這個問題表面化。
遷移指南
#一個開始拋出例外狀況的範例應用程式。
dart
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
builder: (BuildContext context, Widget child) {
// Builds two parallel navigators. This throws
// error because both of navigators are under the same
// hero controller scope created by MaterialApp.
return Stack(
children: <Widget>[
Navigator(
onGenerateRoute: (RouteSettings settings) {
return MaterialPageRoute<void>(
settings: settings,
builder: (BuildContext context) {
return const Text('first Navigator');
}
);
},
),
Navigator(
onGenerateRoute: (RouteSettings settings) {
return MaterialPageRoute<void>(
settings: settings,
builder: (BuildContext context) {
return const Text('Second Navigator');
}
);
},
),
],
);
}
)
);
}
您可以透過引入您自己的英雄控制器範圍來修復這個應用程式。
dart
import 'package:flutter/material.dart';
void main() {
runApp(
MaterialApp(
builder: (BuildContext context, Widget child) {
// Builds two parallel navigators.
return Stack(
children: <Widget>[
HeroControllerScope(
controller: MaterialApp.createMaterialHeroController(),
child: Navigator(
onGenerateRoute: (RouteSettings settings) {
return MaterialPageRoute<void>(
settings: settings,
builder: (BuildContext context) {
return const Text('first Navigator');
}
);
},
),
),
HeroControllerScope(
controller: MaterialApp.createMaterialHeroController(),
child: Navigator(
onGenerateRoute: (RouteSettings settings) {
return MaterialPageRoute<void>(
settings: settings,
builder: (BuildContext context) {
return const Text('second Navigator');
}
);
},
),
),
],
);
}
)
);
}
時程
#已於版本中推出:1.20.0
在穩定版本中:1.20
參考資料
#API 文件
相關問題
相關 PR
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面最後更新於 2024-04-04。 檢視原始碼 或 回報問題。