Для обычной навигации, инициированной пользователем, вам вообще не нужен шаблон BLoC. Просто используйте Navigator
.
Вход - это особый случай. Следуя шаблону BLoC, было бы целесообразно предоставить поток isAuthenticated
:
abstract class MyBloc {
Stream get isAuthenticated;
}
В вашем приложении, вероятно, будут два разных имени маршрута: один для зарегистрированных пользователей и один для анонимных пользователей:
final Map anonymousRoutes = {
'/': (context) => new LoginScreen(), // default for anon
'/register': (context) => new RegisterScreen(),
};
final Map authenticatedRoutes = {
'/': (context) => new HomeScreen(), // default for logged in
'/savings': (context) => new SavingsScreen(),
// ...
};
Обычно Navigator
и его именованные маршруты тесно связаны с MaterialApp
, но вы также можете определить свой собственный, который перестраивается при обновлении потока isAuthenticated
:
class MyApp extends StatelessWidget {
const MyApp({Key key, this.bloc}) : super(key: key);
final MyBloc bloc;
@override
Widget build(BuildContext context) {
return MaterialApp(
builder: (BuildContext context, Widget child) {
return StreamBuilder(
stream: bloc.isAuthenticated,
builder: (BuildContext context, AsyncSnapshot snapshot) {
if (!snapshot.hasData) {
return Text('loading...');
}
bool isAuthenticated = snapshot.data;
return _buildNavigator(isAuthenticated);
},
);
},
);
}
}
Navigator _buildNavigator(bool isAuthenticated) {
// different route tree and different default route depending on auth state
final routes = isAuthenticated ? authenticatedRoutes : anonymousRoutes;
return Navigator(
key: new ValueKey(isAuthenticated),
onGenerateRoute: (RouteSettings settings) {
final name = settings.name;
return new MaterialPageRoute(
builder: routes[name],
settings: settings,
);
},
onUnknownRoute: (RouteSettings settings) {
throw Exception('unknown route');
},
);
}
К сожалению, сейчас (2018-07-14) в коде флаттера есть два противоречивых утверждения , которые вы должны удалить, чтобы сделать код выше работы (вы может просто отредактировать его с вашей IDE):
Линия 93 и 96 в packages\flutter\lib\src\widgets\app.dart
//assert(navigatorObservers != null),
//assert(onGenerateRoute != null || navigatorObservers == const []),
Если вы посмотрите страницу документа для писателя , вы увидите предупреждение вверху, в котором говорится
При вставке записей в документ CSV с помощью League \ Csv \ Writer, сначала вставьте все данные, которые нужно вставить, прежде чем начинать манипулировать CSV. Если вы манипулируете документом CSV перед вставкой, вы можете изменить положение курсора файла и стереть ваши данные.
blockquote>Ваш код вызывает
$writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); $writer->insertOne([$row['mpn'], $row['qty'], $row['price'], $row['description']]);
На каждой итерации выполняется условие, которое, кажется, перезаписывает или отбрасывает вашу предыдущую вставку каждый раз. Вы должны объявить
$writer
один раз перед началом цикла, чтобы сохранить каждую вставку.$writer = Writer::createFromPath('/path/to/saved/file.csv', 'w+'); foreach ($results as $row) { // do stuff with $writer }