Data binding accepts List<T>, configurations or existing DataSource instances. A component owns and disposes sources created from configurations; the application owns borrowed instances. dataSource takes precedence over items. Shared instances also share filters, search, sort and page state. Use separate instances for independent views.
Accept controlled values and lists into application State through on…Changed. The application disposes external TextEditingControllers; widgets dispose internal controllers.
ArrayStores process queries locally; custom stores process them remotely by default. With remoteOperations = false, custom stores must return all raw data. The application defines the server protocol; getters are not serializable. Supply totalCount for server paging. Calendar and chat need full histories or an intentionally limited dataset; paginate = false loads everything.
load/reload/configure can fail: await with try/catch and display error. New loads replace old loads; late responses cannot overwrite newer state. Keys remain unique and immutable. Writes without the required store operation fail. push is not a transaction.
Appointment ends follow their starts. All-day appointments use local day boundaries with an exclusive end. UTC instants display in local time. Chat displays plain text, not HTML; the application supplies backend and AI services.
import 'package:tecexpress/tecexpress.dart';
Future<void> example() async {
final source = TxDataSource.array([1, 2], keyOf: (v) => v);
try { await source.load(); } catch (error) { print(error); }
source.dispose();
}