#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:
Что я использую:
- Вызовите следующий экран с
Navigator.pushNamed(ctx, '/foo', arguments: bar)
помощью . Включайте толькоarguments
при необходимости (например, для экрана «подробности обновления»). - Централизовать все возможные маршруты в виджете, который содержит
MaterialApp
. - Передайте клон переданного аргумента на следующий экран (неизменяемые данные).
В коде:
...
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. Если не клонировать, изменения, внесенные пользователем, будут немедленно отражены в модели — что, если пользователь нажмет «Отмена»?