Navigator 和 Hero Controller Scope 中更嚴格的斷言
概述
#當框架檢測到一個 Hero Controller Scope 中註冊了多個 Navigator 時,它會丟擲一個斷言錯誤。
背景
#Hero Controller Scope 為其 Widget 子樹託管一個 Hero Controller。Hero Controller 一次只能支援一個 Navigator。以前,並沒有斷言來保證這一點。
變更說明
#如果程式碼在此更改後開始丟擲斷言錯誤,這意味著該程式碼在此更改之前就已經存在問題。同一個 Hero Controller Scope 下可能註冊了多個 Navigator,並且當它們的路由發生變化時,它們無法觸發 Hero 動畫。此更改只是暴露了這個問題。
遷移指南
#一個開始丟擲異常的示例應用程式。
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');
}
);
},
),
],
);
}
)
);
}您可以透過引入自己的 Hero Controller Scope 來修復此應用程式。
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