как объявить поставщика с выбираемым блоком, чтобы повторно использовать ту же страницу с одним из нескольких возможных блоков

У меня есть страница с вкладками, но вкладки и часть содержимого начальной страницы различаются в зависимости от роли пользователя. Вся логика и навигация по вкладкам обрабатываются блоком, специфичным для роли пользователя.

Теперь мне интересно, как я могу объявить Провайдера с несколькими блоками, из которых выбран только один. Конечно, я мог бы также использовать мультиблокпровайдера, но тогда у меня были бы все экземпляры одновременно открыты. Я пытался

BlocProvider<(roleDisplayed == 0 ? FirstBloc : SecondBloc)> но это бросает The operator '<' isn't defined for the type 'Type'.

У вас есть идеи, как это объявить?


person w461    schedule 15.12.2020    source источник


Ответы (1)


У вас почти правильный синтаксис. Это было бы больше так:

roleDisplayed == 0 
? BlocProdvider<FirstBloc>()
: BlocProvider<SecondBloc>()

примечание: вы можете использовать оператор switch с тем же эффектом.

Вы можете использовать метод для создания блока в другом файле, а затем вызвать его в пользовательском интерфейсе там, где он вам нужен.

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

import '../../bloc/bloc/first_bloc.dart';

class ChooseBloc {
  getBloc(int roleDisplayed, BuildContext context) {
    if (roleDisplayed == 0) {
      final firstBloc = BlocProvider.of<FirstBloc>(context);
      return BlocBuilder(builder: //builder code here);
    }
  }
}

Что-то подобное.

person Scott Godfrey    schedule 15.12.2020
comment
но тогда мне нужно повторять содержимое страницы для каждого BlocProvider, верно? Например, у меня есть стек с содержимым страницы и моей настраиваемой панелью вкладок внизу. Так разве ваш пример не будет похож на BlocProdvider<FirstBloc>(create:..., child:BlocBuilder(..., builder: (...) {Stack(children:[page(), tabBar()]} ) )? - person w461; 15.12.2020
comment
Я отредактировал свой ответ. - person Scott Godfrey; 15.12.2020
comment
Извините, я плохо сформулировал свое намерение. Я пытался в структуре (1) Widget build(return: - ›(2) BlocProvider<bloc>(child: -› (3) _3 _- ›(4) return Stack(); иметь более или менее фиксированный код для (1) и (4) и только адаптировать ( 2) и (3) выбранному блоку. Очевидно, я могу поместить (4) в отдельный класс и повторно использовать его для любого (2 и 3), но я надеялся, что (1) и (4) будут в одном классе. В любом случае, большое спасибо за вашу помощь !!! Но я думаю, что переосмыслил логику своей страницы, чтобы иметь более чистый код. - person w461; 15.12.2020