跳至主要內容

導覽器與 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