यहाँ आपके मुद्दे पर मेरा दृष्टिकोण है। यह यहाँ से http
पैकेज के कार्यान्वयन पर आधारित है ।
मुख्य विचार इस प्रकार है।
- आपके द्वारा उपयोग की जाने वाली विधियों को परिभाषित करने के लिए एक सार वर्ग बनाएं।
- उन विशिष्टताओं
web
और android
निर्भरताओं के लिए कार्यान्वयन बनाएं जो इस अमूर्त वर्ग का विस्तार करते हैं।
- एक स्टब बनाएं जो इस सार कार्यान्वयन के उदाहरण को वापस करने के लिए एक विधि को उजागर करता है। यह केवल डार्ट विश्लेषण उपकरण को खुश रखने के लिए है।
- अमूर्त वर्ग में इस स्टब फ़ाइल को आयात के लिए सशर्त आयात के साथ
mobile
और web
। फिर इसके कारखाने में निर्माता विशिष्ट कार्यान्वयन का उदाहरण देता है। यह सही ढंग से लिखे जाने पर सशर्त आयात द्वारा स्वचालित रूप से नियंत्रित किया जाएगा।
चरण -1 और 4:
import 'key_finder_stub.dart'
// ignore: uri_does_not_exist
if (dart.library.io) 'package:flutter_conditional_dependencies_example/storage/shared_pref_key_finder.dart'
// ignore: uri_does_not_exist
if (dart.library.html) 'package:flutter_conditional_dependencies_example/storage/web_key_finder.dart';
abstract class KeyFinder {
// some generic methods to be exposed.
/// returns a value based on the key
String getKeyValue(String key) {
return "I am from the interface";
}
/// stores a key value pair in the respective storage.
void setKeyValue(String key, String value) {}
/// factory constructor to return the correct implementation.
factory KeyFinder() => getKeyFinder();
}
चरण-2.1: वेब कुंजी खोजक
import 'dart:html';
import 'package:flutter_conditional_dependencies_example/storage/key_finder_interface.dart';
Window windowLoc;
class WebKeyFinder implements KeyFinder {
WebKeyFinder() {
windowLoc = window;
print("Widnow is initialized");
// storing something initially just to make sure it works. :)
windowLoc.localStorage["MyKey"] = "I am from web local storage";
}
String getKeyValue(String key) {
return windowLoc.localStorage[key];
}
void setKeyValue(String key, String value) {
windowLoc.localStorage[key] = value;
}
}
KeyFinder getKeyFinder() => WebKeyFinder();
चरण -२२: मोबाइल कुंजी खोजक
import 'package:flutter_conditional_dependencies_example/storage/key_finder_interface.dart';
import 'package:shared_preferences/shared_preferences.dart';
class SharedPrefKeyFinder implements KeyFinder {
SharedPreferences _instance;
SharedPrefKeyFinder() {
SharedPreferences.getInstance().then((SharedPreferences instance) {
_instance = instance;
// Just initializing something so that it can be fetched.
_instance.setString("MyKey", "I am from Shared Preference");
});
}
String getKeyValue(String key) {
return _instance?.getString(key) ??
'shared preference is not yet initialized';
}
void setKeyValue(String key, String value) {
_instance?.setString(key, value);
}
}
KeyFinder getKeyFinder() => SharedPrefKeyFinder();
चरण 3:
import 'key_finder_interface.dart';
KeyFinder getKeyFinder() => throw UnsupportedError(
'Cannot create a keyfinder without the packages dart:html or package:shared_preferences');
फिर अपने अमूर्त वर्ग का main.dart
उपयोग करें KeyFinder
जैसे कि एक सामान्य कार्यान्वयन। यह कुछ हद तक एक एडाप्टर पैटर्न की तरह है ।
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_conditional_dependencies_example/storage/key_finder_interface.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
KeyFinder keyFinder = KeyFinder();
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: SafeArea(
child: KeyValueWidget(
keyFinder: keyFinder,
),
),
);
}
}
class KeyValueWidget extends StatefulWidget {
final KeyFinder keyFinder;
KeyValueWidget({this.keyFinder});
@override
_KeyValueWidgetState createState() => _KeyValueWidgetState();
}
class _KeyValueWidgetState extends State<KeyValueWidget> {
String key = "MyKey";
TextEditingController _keyTextController = TextEditingController();
TextEditingController _valueTextController = TextEditingController();
@override
Widget build(BuildContext context) {
return Material(
child: Container(
width: 200.0,
child: Column(
children: <Widget>[
Expanded(
child: Text(
'$key / ${widget.keyFinder.getKeyValue(key)}',
style: TextStyle(fontSize: 20.0, fontWeight: FontWeight.bold),
),
),
Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: "Key",
border: OutlineInputBorder(),
),
controller: _keyTextController,
),
),
Expanded(
child: TextFormField(
decoration: InputDecoration(
labelText: "Value",
border: OutlineInputBorder(),
),
controller: _valueTextController,
),
),
RaisedButton(
child: Text('Save new Key/Value Pair'),
onPressed: () {
widget.keyFinder.setKeyValue(
_keyTextController.text,
_valueTextController.text,
);
setState(() {
key = _keyTextController.text;
});
},
)
],
),
),
);
}
}
कुछ स्क्रीन शॉट्स
वेब
मोबाइल
localstorage
औरshared preferences
एक ही विधि या कक्षा में निर्भरता। इसका मतलब यह है कि कंपाइलर इन दोनों में से किसी पर निर्भरता को कम नहीं कर सकता है। आदर्श रूप से आयात को इन कार्यान्वयनों को छिपाना चाहिए। मैं एक स्पष्ट कार्यान्वयन उदाहरण के साथ आने की कोशिश करूंगा।