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
SingleChildWidget
s 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 tuMultiProvider
está siendo declarada como null en algún momento. Puede ser que una de las listas que estás combinando enproviders
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 widgetMultiProvider
. 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 deProvider
válidas. También asegúrate de que tus proveedores estén registrados correctamente en el widgetMultiProvider
.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
yMyUseCase
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 utilizandoProvider.of<T>(context)
.Respondida el Dec 19, 2020 a las 13:27 - por Gemini
Votos positivos: 0 | Votos negativos: 0