Вот что я в итоге сделал. Это было довольно прямолинейно. Я реализовал это как статический класс и не уверен, что это лучший подход. Но мне все нравится.
Я создал класс, который устанавливает слушателя для документа, а также предоставляет поток для того, когда он обновляется. В качестве частичной работы мой класс также анализирует документ на карте и сортирует игры.
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:async';
import 'package:pari/game.dart';
class Schedule {
static Map<String, Game> games = Map<String, Game>();
static StreamController<Map<String, Game>> _onUpdateController = StreamController.broadcast();
static Stream get onUpdate => _onUpdateController.stream;
static void setupListener() {
print('setupListener');
DocumentReference reference = Firestore.instance.collection('schedule').document('2018');
reference.snapshots().listen((documentSnapshot) {
print('listen begin');
List<Game> sortedList = List<Game>();
documentSnapshot.data.values.forEach((value) {
Game game = Game.fromMap(value);
sortedList.add(game);
});
sortedList.sort((a,b) => a.startTime.compareTo(b.startTime));
games.clear();
sortedList.forEach((game) {
games.addAll({game.key: game});
});
_onUpdateController.add(games);
print('listen end');
print('games: ${games.length}');
});
}
}
Это не является частью спецификации для column-gap
( https://www.w3.org/TR/xsl11/#column-gap ), и я не знаю ни одного форматера XSL который реализует это.
Одним из способов подделки было бы использование нескольких fo:region-body
и потоковой карты, которая направляет контент в каждую область по очереди. См. https://www.w3.org/TR/xsl11/#fafm . Для различий между вторым и третьим столбцами вам понадобятся два двухколоночных fo:region-body
. Однако не все средства форматирования XSL реализуют карты потоков, плюс вы не можете иметь контент с span="all"
, который охватывал бы все столбцы: в лучшем случае он охватывал бы все столбцы в одном из fo:region-body
. [118 ]