Problema con la declaración multiprovidente en la vista

Cuando empiezo mi aplicación, tengo un problema con mi multiprovidente en el desorden :

'children != null && children.isNotEmpty': is not true

Error:

La siguiente afirmación fue lanzada construcción Application(dirty): 'package:nested/nested.dart': Afirmación fallida: línea 72 pos 16: 'niños != null ' niños. isNotEmpty': no es verdad. El widget de causa de error relevante fue Aplicación lib\main.dart:8 Cuando la excepción fue lanzada, esta era la pila #2 new Nested paquete:nested/nested.dart:72

El código :

class Application extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MultiProvider(
      providers: providers,
      child: _application(context),
    );
  }

  Widget _application(BuildContext context) {
    return MaterialApp(
      title: 'Simple Rest API',
      initialRoute: '/',
      routes: {
        '/': (context) => TeamsView(),
      },
    );
  }
}

EDIT:

Mi DI :

List providers = [
  ...services,
  ...datas,
  ...repositories,
  ...usescases,
];

List services = [];

List datas = [];

List repositories = [];

List usescases = [];

class ViewModelBuilder {
  static final _instances = {TeamsViewModel: () => TeamsViewModel()};

  static ViewModel instanciate(Type type) {
    return _instances[type]();
  }
}

Mi vista :

class TeamsView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return View(
      args: [],
      builderView: (context, model, child) => _buildView(context, model),
    );
  }
}

Widget _buildView(BuildContext context, TeamsViewModel model) {
  return Scaffold(
    appBar: AppBar(
      title: Text("Test"),
    ),
    body: Center(
      child: Text("Premier lancement"),
    ),
  );
}

Mi modelo de vista :

class TeamsViewModel extends ViewModel {
  BuildContext _context;
  void load(BuildContext context, List args) async {
    _context = context;
    setLifecycle(OnLoad());
    setLifecycle(OnLoaded());
  }
}

Si quieres otro código, pregúntame.

Pregunta hecha hace 3 años, 4 meses, 28 días - Por logiclinguist


4 Respuestas:

  • De acuerdo con el documentación, los proveedores en su lista deben estar estructurados así:

    MultiProvider(
      providers: [
        Provider(create: (_) => Something()),
        Provider(create: (_) => SomethingElse()),
        Provider(create: (_) => AnotherThing()),
      ],
      child: someWidget,
    )
    

    En otras palabras, usted debe suministrar el create métodos.

    Tampoco está dando una lista de proveedores, sino una lista de valores.

    Respondida el Dec 18, 2020 a las 13:18 - por compilerczar

    Votos positivos: 0 | Votos negativos: 0

  • El problema es su lista de SingleChildWidgets está vacío (como es el resultado de la destrucción de 4 listas vacías). Usted debe proporcionar al menos un SingleChildWidget.

    Respondida el Dec 18, 2020 a las 13:28 - por debugdragon

    Votos positivos: 0 | Votos negativos: 0

  • El error que estás obteniendo indica que la lista children en tu MultiProvider está siendo declarada como null en algún momento. Puede ser que una de las listas que estás combinando en providers esté llegando como null.

    Puedes intentar corregir este problema asegurándote de que ninguna de las listas (services, datas, repositories, usescases) esté llegando como null. También es recomendable agregar validaciones para comprobar si las listas están vacías antes de combinarlas en providers.

    Además, ten en cuenta que al declarar las listas al principio de tu código, es posible que estén vacías al principio y se llenen más tarde en el proceso de inicialización. Asegúrate de que las listas estén completas al momento de usarlas en providers.

    Por último, te recomendaría verificar el flujo de datos en tu aplicación para detectar en qué momento se están creando las listas y si están llegando correctamente a la vista TeamsView.

    Espero que estas sugerencias te ayuden a resolver el problema. ¡Déjame saber si necesitas más ayuda!

    Respondida el Dec 19, 2020 a las 13:15 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El error que recibes indica que children es nulo o vacío en el widget MultiProvider. Esto significa que no estás proporcionando ningún proveedor a tus widgets secundarios.

    Para resolver este problema, asegúrate de que tu lista providers no esté vacía y que contenga instancias de Provider válidas. También asegúrate de que tus proveedores estén registrados correctamente en el widget MultiProvider.

    Aquí tienes un ejemplo de cómo puedes usar MultiProvider correctamente:

    dart
    import 'package:provider/provider.dart';
    
    class Application extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MultiProvider(
          providers: [
            Provider(create: (_) => MyService()),
            Provider(create: (_) => MyData()),
            Provider(create: (_) => MyRepository()),
            Provider(create: (_) => MyUseCase()),
          ],
          child: _application(context),
        );
      }
    
      Widget _application(BuildContext context) {
        return MaterialApp(
          title: 'Simple Rest API',
          initialRoute: '/',
          routes: {
            '/': (context) => TeamsView(),
          },
        );
      }
    }
    

    Ten en cuenta que debes reemplazar MyService, MyData, MyRepository y MyUseCase con tus propias clases de proveedor.

    Una vez que hayas corregido el problema con MultiProvider, deberías poder acceder a tus proveedores en tus widgets secundarios utilizando Provider.of<T>(context).

    Respondida el Dec 19, 2020 a las 13:27 - por Gemini

    Votos positivos: 0 | Votos negativos: 0