Рекомендации Flutter по обмену данными между экранами

#flutter #screen #share #between

#flutter #экран #Поделиться #между

Вопрос:

Я новичок в flutter и прочитал много документации по нескольким темам. Одним из них является обмен данными между экранами. Я нашел много решений, и, поскольку я создаю базовый проект с множеством функций, я хочу знать, какой из них лучший

Решение 1: в конструкторе

В основном, когда мы перемещаемся, мы отправляем данные через виджет next constructor.

Решение 2: в сеансе

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

Решение 3: в блоках

Я прочитал это решение, которое выглядит хорошо:

Я создал класс контейнера блоков, в котором я создал экземпляры блоков двух экранов. Затем здесь я устанавливаю ссылку из блока A на поток блока B, куда я хочу отправить данные. Блоки по-прежнему разделены, потому что они ничего не знают друг о друге, блок A не передается через конструктор в блоке B и наоборот, но он просто знает, что он получит некоторые данные в одном из своих потоков.

ОБНОВЛЕНО:

Решение 4: унаследованный виджет

С помощью статической функции, такой как :

 static InheritedDataProvider of(BuildContext context) => context.inheritFromWidgetOfExactType(InheritedDataProvider);
}
 

Таким образом, вы можете получить доступ к данным, инициализированным в родительском элементе, с помощью чего-то вроде :
final data = InheritedDataProvider.of(context).data;

Может быть, есть другие решения, и я буду рад их узнать. Спасибо

Комментарии:

1. Лично я использую комбинацию решений1 и 3, мне не нравятся синглтоны

2. @AdnanAlshami почему бы не использовать только решение 3?

3. допустим, у меня есть ScreenA , который извлекает список блогов и ScreenB отображает сведения о блоге. в этом сценарии я передам модель блога из ScreenA в ScreenB вместо того, чтобы повторно извлекать ее снова.

Ответ №1:

Лучший способ — передать параметр конструктору

 Navigator.push(
                context,
                PageTransition(
                    type: PageTransitionType.fade,
                    child: LoginPage(
                      userModel: model,
                    )));
 

затем :

 class LoginPage extends StatefulWidget {
  LoginPage({this.userModel});
  User userModel;
  @override
  _LoginPageState createState() => _LoginPageState(userModel: userModel);
  }  

 class _LoginPageState extends State with TickerProviderStateMixin {
  User userModel;
  _LoginPageState({this.userModel}); 

   }
}
 

Комментарии:

1. Не могли бы вы предоставить нам более подробную информацию о том, почему это лучший способ для вас, пожалуйста?

Ответ №2:

Что я использую:

  1. Вызовите следующий экран с Navigator.pushNamed(ctx, '/foo', arguments: bar) помощью . Включайте только arguments при необходимости (например, для экрана «подробности обновления»).
  2. Централизовать все возможные маршруты в виджете, который содержит MaterialApp .
  3. Передайте клон переданного аргумента на следующий экран (неизменяемые данные).

В коде:

   ...
  MaterialApp(
    onGenerateRoute: (s) => MaterialPageRoute(builder: (ctx) => _route(s), settings: s),
  )
  ...

  Widget _route(RouteSettings route) {
    switch (route.name) {
      case '/signup':
        return SignupRoute();
      case '/vendor':
        return VendorRoute((route.arguments as Vendor)?.data?.clone());
      default:
        throw ('No match for ${route.name}');
    }
  }
 

Комментарии:

1. почему вы клонируете свой объект?

2. @Rodrigue Я использую Mobx.dart, библиотеку управления состоянием, подобную BLoC. Если не клонировать, изменения, внесенные пользователем, будут немедленно отражены в модели — что, если пользователь нажмет «Отмена»?