setState() or markNeedsBuild() called during build during build 以及如何解决它
setState() or markNeedsBuild() called during build during build and how to resolve it
构建过程中调用的setState()或markNeedsBuild()以及如何解决。
你能解释一下这个吗---------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- -
import 'package:dishes_app/Dummy_data.dart';
import 'package:dishes_app/Screens/Categories_screen.dart';
import 'package:dishes_app/Screens/Category_meals_screen.dart';
import 'package:dishes_app/Screens/filter_screen.dart';
import 'package:dishes_app/Screens/meal_detail_screen.dart';
import 'package:dishes_app/Screens/tab_screen.dart';
import 'package:flutter/material.dart';
import 'models/meal.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
// This widget is the root of your application.
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Map<String, bool> _filters = {
'gluten': false,
'lactose': false,
'vegan': false,
'vegetarian': false,
};
List<Meal> _availablemeals = DUMMY_MEALS;
void _setFilters(Map<String, bool> filterData) {
setState(() {
_filters = filterData;
_availablemeals = DUMMY_MEALS.where((meal) {
if (_filters['gluten']! && !meal.isGlutenFree) {
return false;
}
if (_filters['lactose']! && !meal.isLactoseFree) {
return false;
}
if (_filters['vegan']! && !meal.isVegan) {
return false;
}
if (_filters['vegetarian']! && !meal.isVegetarian) {
return false;
}
return true;
}).toList();
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.blue,
accentColor: Colors.amber,
canvasColor: Color.fromRGBO(255, 254, 229, 1),
fontFamily: 'Raleway',
textTheme: ThemeData.light().textTheme.copyWith(
body1: TextStyle(
color: Color.fromRGBO(20, 51, 51, 1),
),
body2: TextStyle(color: Color.fromRGBO(20, 51, 51, 1)),
title: TextStyle(
fontSize: 20,
fontFamily: 'RobotoCondensed',
fontWeight: FontWeight.bold,
),
)),
routes: {
'/': (ctx) => TabsScreen(),
CategoryMealsScreen.routeName: (ctx) =>
CategoryMealsScreen(_availablemeals),
MealDetailScreen.routeName: (ctx) => MealDetailScreen(),
FilterScreen.routeName: (ctx) =>
FilterScreen(_setFilters(_filters) as Function(Map)),
},
onGenerateRoute: (settings) {
print(settings.arguments);
},
onUnknownRoute: (settings) {
return MaterialPageRoute(builder: (ctx) => CategoriesScreen());
},
);
}
}
如果您在构建方法完成之前显示快餐栏或警告对话框,以及在许多其他情况下,您可能会遇到此错误。所以在这种情况下使用下面的回调函数。
WidgetsBinding.instance.addPostFrameCallback((_){
// To do
});
这一行:
FilterScreen.routeName: (ctx) =>
FilterScreen(_setFilters(_filters) as Function(Map)),
_setFilters(_filters)
实际上是在调用函数本身,而不是像它应该的那样将函数作为参数传递。如果这正是您想要在函数中执行的操作,则创建一个匿名调用,如下所示:
FilterScreen.routeName: (ctx) =>
FilterScreen((){_setFilters(_filters);} as Function(Map)),
根据您的 FilterScreen,您可以直接传递 _setFilters
,但这样您将无法预先提供任何参数。
构建过程中调用的setState()或markNeedsBuild()以及如何解决。 你能解释一下这个吗---------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- ---------------------------------------------- -
import 'package:dishes_app/Dummy_data.dart';
import 'package:dishes_app/Screens/Categories_screen.dart';
import 'package:dishes_app/Screens/Category_meals_screen.dart';
import 'package:dishes_app/Screens/filter_screen.dart';
import 'package:dishes_app/Screens/meal_detail_screen.dart';
import 'package:dishes_app/Screens/tab_screen.dart';
import 'package:flutter/material.dart';
import 'models/meal.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatefulWidget {
// This widget is the root of your application.
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
Map<String, bool> _filters = {
'gluten': false,
'lactose': false,
'vegan': false,
'vegetarian': false,
};
List<Meal> _availablemeals = DUMMY_MEALS;
void _setFilters(Map<String, bool> filterData) {
setState(() {
_filters = filterData;
_availablemeals = DUMMY_MEALS.where((meal) {
if (_filters['gluten']! && !meal.isGlutenFree) {
return false;
}
if (_filters['lactose']! && !meal.isLactoseFree) {
return false;
}
if (_filters['vegan']! && !meal.isVegan) {
return false;
}
if (_filters['vegetarian']! && !meal.isVegetarian) {
return false;
}
return true;
}).toList();
});
}
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primaryColor: Colors.blue,
accentColor: Colors.amber,
canvasColor: Color.fromRGBO(255, 254, 229, 1),
fontFamily: 'Raleway',
textTheme: ThemeData.light().textTheme.copyWith(
body1: TextStyle(
color: Color.fromRGBO(20, 51, 51, 1),
),
body2: TextStyle(color: Color.fromRGBO(20, 51, 51, 1)),
title: TextStyle(
fontSize: 20,
fontFamily: 'RobotoCondensed',
fontWeight: FontWeight.bold,
),
)),
routes: {
'/': (ctx) => TabsScreen(),
CategoryMealsScreen.routeName: (ctx) =>
CategoryMealsScreen(_availablemeals),
MealDetailScreen.routeName: (ctx) => MealDetailScreen(),
FilterScreen.routeName: (ctx) =>
FilterScreen(_setFilters(_filters) as Function(Map)),
},
onGenerateRoute: (settings) {
print(settings.arguments);
},
onUnknownRoute: (settings) {
return MaterialPageRoute(builder: (ctx) => CategoriesScreen());
},
);
}
}
如果您在构建方法完成之前显示快餐栏或警告对话框,以及在许多其他情况下,您可能会遇到此错误。所以在这种情况下使用下面的回调函数。
WidgetsBinding.instance.addPostFrameCallback((_){
// To do
});
这一行:
FilterScreen.routeName: (ctx) =>
FilterScreen(_setFilters(_filters) as Function(Map)),
_setFilters(_filters)
实际上是在调用函数本身,而不是像它应该的那样将函数作为参数传递。如果这正是您想要在函数中执行的操作,则创建一个匿名调用,如下所示:
FilterScreen.routeName: (ctx) =>
FilterScreen((){_setFilters(_filters);} as Function(Map)),
根据您的 FilterScreen,您可以直接传递 _setFilters
,但这样您将无法预先提供任何参数。