Анимация для именованных маршрутов - PullRequest
0 голосов
/ 08 октября 2018

Во Flutter мы можем настроить анимацию смены вида, увеличив PageRoute (или используя класс, который расширяет это).

Например, я изменяю анимацию на «слайд» в моемMaterialApplication, используя CupertinoPageRoute таким образом:

Navigator.of(context).pushReplacement(
  CupertinoPageRoute(builder: (context) => Calendar()),
);

Теперь я хочу изменить это, используя именованные представления, определенные в файле main.dart:

return MaterialApp(
  title: 'Demo',
  theme: myTheme, // => Theme.of(context).copyWith(...)
  initialRoute: '/',
  routes: {
    '/': (context) => Login(),
    '/calendar': (context) => Calendar(),
  }
);

Таким образомЯ могу просто позвонить

Navigator.of(context).pushReplacementNamed('/calendar');

Что является более понятным и независимым от IMO.

Проблема с этим подходом заключается в том, что я не могу определить PageRoute, поэтому я не могунастроить анимацию смены вида.

Есть ли способ сделать это?

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Я воспользовался советом хемамолинов и решил его аналогичным образом, но с использованием карт.

Я "извлек" объект routes и поместил его вне MaterialApp:

var routes = {
  '/': (context) => Login(),
  '/calendar': (context) => Calendar()
};

Тогда я использовал его внутри onGenerateRoute:

Widget build(BuildContext context) {
  var routes = {
    '/': (context) => Login(),
    '/calendar': (context) => Calendar()
  };

  return MaterialApp(
    title: 'Demo',
    theme: myTheme,
    initialRoute: '/',
    onGenerateRoute: (settings) {
      return CupertinoPageRoute(builder: (context) => routes[settings.name](context));
    }
  );
}
0 голосов
/ 08 октября 2018

Вы можете использовать onGenerateRoute()

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  Route onGenerateRoute(RouteSettings settings) {
    Route page;
    switch (settings.name) {
      case "/":
        page = CupertinoPageRoute(builder: (context) => Login());
        break;
      case "/calendar":
        page = CupertinoPageRoute(builder: (context) => Calendar());
        break;
    }
    return page;
  }

  @override
  Widget build(BuildContext context) {
    return new WidgetsApp(
      onGenerateRoute: onGenerateRoute,
      initialRoute: "/",
    );
  }
}

Давайте посмотрим на сам код Flutter.

В рамках инфраструктуры предусмотрен метод onGenerateRoute(), вызываемый для генерации маршрутов.

Посмотрите на следующий фрагмент кода из файла app.dart в платформе.

  Route<dynamic> _onGenerateRoute(RouteSettings settings) {
    final String name = settings.name;
    WidgetBuilder builder;
    if (name == Navigator.defaultRouteName && widget.home != null) {
      builder = (BuildContext context) => widget.home;
    } else {
      builder = widget.routes[name];
    }
    if (builder != null) {
      return new MaterialPageRoute<dynamic>(
        builder: builder,
        settings: settings,
      );
    }
    if (widget.onGenerateRoute != null)
      return widget.onGenerateRoute(settings);
    return null;
  }

Если routes: предоставляет построитель для данного имени, он используется для генерации маршрута с использованием MaterialPageRoute по умолчанию.Если он не предоставлен, он генерируется с использованием вашего метода onGenerateRoute().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...